"""
Инструменты для отладки и проверки работоспособности системы

- Приветственное сообщение с основной информацией сборке.
- debug: выводит содержимое Context. Event.
- Отключение Чио.
- Вывести путь к плагину.
- Вызвать исключение.
- Вывести содержимое настроек Чио.
- Переключить безопасный режим.
- Вывести информацию о запущеном движке.
- Узнать путь к команде.

Author: Milinuri Nirvalen
Ver: 1.2.2 (7)
"""

from chiori import Config
from chiori import Plugin
from chiori import Ui

import time

p = Plugin(name='system utils', admins=True, sp=["sys", "s", "system"],
	desc='набор инструментов для администраторов')


# ##############################
# functions: printname, get_headers
# ##############################

def printname(c1, c2):
	return f'''{c1} ██████╗██╗  ██╗██╗ ██████╗ ██████╗ ██╗███╗   ██╗
{c1}██╔════╝██║  ██║██║██╔═══██╗██╔══██╗██║████╗  ██║
{c1}██║     ███████║██║██║   ██║██████╔╝██║██╔██╗ ██║
{c2}██║     ██╔══██║██║██║   ██║██╔══██╗██║██║╚██╗██║
{c2}╚██████╗██║  ██║██║╚██████╔╝██║  ██║██║██║ ╚████║
{c2} ╚═════╝╚═╝  ╚═╝╚═╝ ╚═════╝ ╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝'''

def get_headers(app):
	router = {"admins":0, 'users':0}

	for k, v in app.routers.items():
		if v["admins"]:
			router["admins"] += 1
		else:
			router["users"] += 1

	for l, c in sorted(router.items(), key= lambda x: x[1], reverse=True):
		print(f' | {p.l.cyan}{l}{p.l.reset}	{c}')


# ##############################
# handlers: init
# ##############################

@p.eventHandler('init')
async def _(app):
	u = Ui()
	text = ''
	if app.secure_call:
		text += printname(u.lcyan, u.lblue)
	else:
		text += printname(u.lyellow, u.lred)

	text += f'''\n{u.reset}{"═"*50}
--- {app.name} {u.gray}(V{app.ver}){u.reset} | {len(app.plugins)} плагинов
\nдополнительные префиксы:'''

	for k, v in app.sp.items():
		if len(v):
			text += f'\n{u.cyan}{k}{u.reset}: {len(v)} обработчиков'

	text += f'\nобработчики:'
	for k, v in app.handlers.items():
		if len(v):
			text += f' {u.reset}{len(v)} {u.cyan}{k[0:2]}{u.reset};'

	text += f'\nкоманд: {app.commands} {p.l.gray}({len(app.routers)} обработчиков){p.l.reset}'
	u.form(text)

# ##############################
# routers:
# ##############################

@p.command('debug', 'event', 'ctx',
	usage='[raw] возвращает экземпляр события')
async def debugMessage(event, ctx):
	if ctx.sargs in ['raw']:
		text = f'\n~~~~~~~~~~~~~~~~~~~\n{event.get("raw")}'
	elif ctx.sargs:
		text = f'{ctx.sargs} -> {event.get(ctx.sargs)}'
	else:
		text = f'event:'

		for k, v in event.model.items():
			if k == 'raw':
				continue
			text += f'\n{k} --> {v}'

		text += f'\n\ncontext:'
		for k, v in ctx.__dict__.items():
			text += f'\n{k} --> {v}'

	await ctx.message(text)


@p.command('off', 'exit', 'выключить', 'выход',
	usage='вызывет событие stopEvent')
async def shutdown(event, ctx):
	await ctx.message('<c> Спокойной ночи, семпай.')
	await ctx.app.stopEvent()


@p.command('path', 'путь',
	usage='вывести путь к плагину')
async def pathToPlugin(event, ctx):
	await ctx.message(f'''PID: {p.pid}
путь к плагину: {p.path}
имя файла: {p.filename}''')


@p.command("config", 'c', 'конфиг',
	 usage="[key] [value] управление системным конфигом")
async def sustemConfig(event, ctx):
	if not ctx.args:
		c = ctx.app.c.group_data
		text = "системный конфиг:"
		for k, v in c.items():
			text += f"\n{k} -> {v}"
	elif len(ctx.args) == 1:
		c = ctx.app.c.group_data
		if ctx.sargs in c:
			text = f"{ctx.sargs} -> {c[ctx.sargs]}"
		else:
			text = f"параметр {ctx.sargs} не найден"

	elif len(ctx.args) > 1:
		c = Config("chiori")
		if ctx.args[1] in ["del"]:
			if ctx.args[0] in c.group_data:
				del c.group_data[ctx.args[0]]
				text = f"удалено {ctx.args[0]}"
			else:
				text = f"параметр {ctx.args[0]} не найден"
		else:
			c.group_data[ctx.args[0]] = ctx.args[1]
			text = f"{ctx.args[0]} <- {ctx.args[1]}"

		c.save()

	await ctx.message(text)


@p.command('chmode', 'chmod', 'режим',
	usage='переключает безопасный режим')
async def changeMode(event, ctx):
	c = Config('chiori')
	if c.group_data['secure_call']:
		c.group_data['secure_call'] = False
		status = 'выключен'
	else:
		c.group_data['secure_call'] = True
		status = 'включён'

	c.save()
	await ctx.message(f'безопасный режим: {status}\nперезагрузите чио.')


@p.command('b', 'движок', usage='вывести информацию движка')
async def backend(event, ctx):
	await ctx.message(f'движок: {ctx.app.backend.name} (V{ctx.app.backend.ver})')


@p.command('cmd', 'команда', usage='[name] узнать путь к команде')
async def getCommandsPath(event, ctx):
	if ctx.sargs in ctx.app.triggers:
		await ctx.message(f'"{ctx.sargs}" -> {ctx.app.triggers[ctx.sargs]}')
	else:
		await ctx.message(f'"{ctx.sargs}" не является командой')

@p.command('updtime', usage="Время на обработку команды")
async def updTime(event, ctx):
	now = time.time()
	await ctx.message(f'Utime: {now-ctx.utime}s.')
